package spring_learn.a11;

import org.springframework.cglib.proxy.Callback;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;


/*
 * cglib 不要求目标实现接口，它生成的代理类是目标的子类，因此代理与目标之间是子父关系
 * 限制：根据上述分析 final 类无法被 cglib 增强
 */
public class cjclibProxyDemo {

    static class hello2{
        void hello(){
            System.out.println("hello!");
        }
    }

    public static void main(String[] args) {
        hello2 hello2 = new hello2();
        hello2 o = (hello2)Enhancer.create(hello2.class, new MethodInterceptor() {
            @Override
            public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
                System.out.println("before");
                //使用反射调用目标
                //Object res = method.invoke(hello2, objects);

                //内部没有使用反射，需要目标
                //Object res = methodProxy.invoke(hello2, objects);

                //内部没有使用反射，需要代理
                Object res = methodProxy.invokeSuper(o, args);
                System.out.println("after");
                return res;
            }
        });
        System.out.println(o.getClass());
        //得到的代理类是目标类型的子类
        //代理是通过继承实现的
        System.out.println(o.getClass().getSuperclass());
        o.hello();
    }
}
